#include <stdio.h>

typedef float Dtype; //自定义amini的数据类型

typedef struct _queue_{
    char empty;
    char full;
    Dtype *buf;
    unsigned int rptr;  //读指针
    unsigned int wptr;   //写指针
    int depth;    //fifo深度
    int len;  //现存的数据量
} QMINI;

/********************************************
 * Qinit
 * 初始化 mini 队列
 * 参数1：QMINI对象
 * 参数2：数据缓存buf
 * 参数3：mini 队列大小(fifo深度)
 * 返回值：操作成功返回 0 ，否则返回 正数
 ********************************************/
int Qinit(QMINI *q,Dtype *buf, int bufSize){
    if(buf == 0 || bufSize <= 0) return 1; 
    q->buf = buf;
    q->empty = 1;
    q->full = 0 ;
    q->rptr = 0;
    q->wptr = 0;
    q->depth = bufSize; 
    q->len = 0;
    return 0;
}
/********************************************
 * Qpush
 * 数据入队操作
 * 参数1：QMINI对象
 * 参数2：入队数据
 * 返回值：操作成功返回 0 ，否则返回 正数
 ********************************************/
int Qpush(QMINI *q,Dtype data){
    if(q == 0 && q->buf == 0) return 1;//未创建 mini 队列
    q->buf[q->wptr] = data ;
    q->wptr ++ ;
    if( q->wptr == q->depth ) q->wptr = 0;
    q->full = ( ++ q->len >= q->depth) ? 1 : 0;
    q->empty = 0;
    return 0;
}
/********************************************
 * Qpop
 * 数据出队操作
 * 参数1：QMINI对象
 * 返回值：出队的数据
 ********************************************/
Dtype Qpop(QMINI *q){
    if( -- q->len <= 0) { q->empty = 1; }
    q->full = 0;
    Dtype rt = q->buf[q->rptr];
    q->rptr = (q->rptr >= q->depth ) ? 0 : q->rptr + 1;
    return rt;
}

//---------------------------
Dtype a[6] ;
QMINI mq;
int main(){
    int i ;
    if( Qinit(&mq,a,sizeof(a)/sizeof(a[0]) ) != 0){
        printf("初始化失败\r\n");
    } 
    for(i=0;i<=mq.depth;i++){
        if( !mq.full ) Qpush(&mq,i*3.3);
        else printf("%d:队列已满\r\n",i);
    }
    printf("-----------------------\r\n");
    for(i=0;i<=mq.depth;i++){
        if( !mq.empty ) {
            Dtype data = Qpop(&mq);
            printf("%d:获得数据为%f\r\n",i,data);
        }
        else printf("%d:队列为空\r\n",i);
    }
    
    
    return 0;
}